﻿#include "interpreter.h"

int find_match_parenth(int i, string &statement);
void remove_escape_character(string& statement);

// 컴퓨터가 이해할 수 있게 가장 쉬운 수준의 bytecode 명령으로
// statement 를 변환한다. 
void generate_bytecode(string &statement)
{
	vector<string> bytecode; // 한 statement 의 바이트 코드들의 모음 

	try{ process_brakets(statement);}
	catch(Error::General_error err)
	{
		cout << err.error_message << endl;
		throw Error::General_error(0);
	}
	cout << statement << endl;

	// 가장 먼저 실행되는 조각들 부터 차례대로 변환된다. 
	while (true)
	{
		int deepest_braket = -1;
		int braket_count = 0;

		for(int find = 0; find < statement.length(); find ++)
		{

			if(statement[find] == '(' && find == 0)
			{
				deepest_braket = find;
				braket_count ++;
				continue;
			}		

			if(statement[find] == '(')
				braket_count ++;
			else if(statement[find] == ')')
				braket_count --;

			if(statement[find] == '(')
			{
				if(find > 0 && statement[find - 1] != '\\' && braket_count > deepest_braket)
					deepest_braket = find;
			}
		}

		string statement_process = 
			statement.substr(deepest_braket, find_match_parenth(deepest_braket, statement) - deepest_braket + 1);

		remove_escape_character(statement_process);

		// 사용한 중괄호에 \ 를 추가한다. 
		try{statement.insert(find_match_parenth(deepest_braket, statement), "\\");}
		catch(Error::Syntax_error err)
		{
			cout << err.error_message << endl;
			throw Error::General_error(0);
		}
		statement.insert(deepest_braket, "\\");


	}
}
int find_match_parenth(int i, string &statement)
{
	int j, count = 0;
	int statement_length = statement.length();

	if(statement[i] == '(' || statement[i] == '{' )
	{
		for(j = i + 1; j < statement_length; j++)
		{
			if(statement[j] == '(')
				count ++;
			else if(statement[j] == ')')
				count --;

			if(count == -1)
				return j;
		}
	}
	else if(statement[i] == ')')
	{
		for(j = i - 1; j >= 0; j--)
		{
			if(statement[j] == '(')
				count ++;
			else if(statement[j] == ')')
				count --;

			if(count == 1)
				return j;
		}
	}

	throw Error::Syntax_error(4); // 애러
}
void remove_escape_character(string& statement)
{
	string::size_type location;

	location = statement.find("\\(");
	while (location != string::npos)
	{
		statement.replace(location, 2, "(");
		location = statement.find("\\(");
	}

	location = statement.find("\\)");
	while (location != string::npos)
	{
		statement.replace(location, 2, ")");
		location = statement.find("\\)");
	}
}
int create_simple_bytecode(string statement, int temp_used)
{
	// 만들어진 bytecode 문장에서 사용된 temp 의 최대 번호를 리턴한다. 

}